<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>13_Promise-Promise类方法allSettled</title>
    <!-- 
  在 JavaScript 中， `Promise.allSettled`  是一个静态方法，用于处理多个  `Promise`  实例。与  `Promise.all`  不同， `Promise.allSettled`  不会在任何一个  `Promise`  失败时立即拒绝，而是会等待所有的  `Promise`  完成（无论是成功还是失败），并返回每个  `Promise`  的结果。
  1. 基本概念
  - ** `Promise.allSettled(iterable)` **：接收一个可迭代对象（通常是数组），该对象包含多个  `Promise`  实例。
  - 该方法返回一个新的  `Promise` ，该  `Promise`  的状态在所有传入的  `Promise`  都完成（无论成功或失败）时改变。

  2. 语法
  Promise.allSettled(iterable);
  -  `iterable` ：一个可迭代对象，通常是一个数组，包含多个  `Promise`  对象。

  3. 返回值
  - 返回一个新的  `Promise` ，其解析值是一个数组，数组中的每个元素都是一个对象，表示对应的  `Promise`  的结果。
  - 每个结果对象包含两个属性：
    -  `status` ：表示  `Promise`  的状态，可能是  `"fulfilled"` （成功）或  `"rejected"` （失败）。
    -  `value` （如果状态为  `"fulfilled"` ）或  `reason` （如果状态为  `"rejected"` ）：

  4. 示例代码
   4.1 所有  `Promise`  完成
  const promise1 = Promise.resolve(1);
  const promise2 = Promise.reject('Error occurred');
  const promise3 = Promise.resolve(3);

  Promise.allSettled([promise1, promise2, promise3])
      .then(results => {
          console.log(results);
          /*
          输出:
          [
              { status: 'fulfilled', value: 1 },
              { status: 'rejected', reason: 'Error occurred' },
              { status: 'fulfilled', value: 3 }
          ]
          */
      });
  5. 注意事项
  -  `Promise.allSettled`  可以用于需要处理多个异步操作，并且不希望因某一个操作失败而中断其他操作的场景。
  - 该方法适用于当你需要收集所有操作的结果，而不仅仅是成功的结果时。

  6. 总结
  `Promise.allSettled`  是处理多个  `Promise`  的一种有用方法，它允许开发者在所有异步操作完成后统一处理结果，而不必担心某个操作的失败会影响到其他操作的执行。理解  `Promise.allSettled`  的用法可以帮助开发者更灵活地管理异步操作，尤其是在需要同时进行多个异步请求并希望获取所有结果的情况下。
  --></head>
  <body>
    <script>
      // 创建三个Promise
      const p1 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve("resolve p1");
        }, 1000);
      });

      const p2 = new Promise((resolve, reject) => {
        setTimeout(() => {
          reject("reject p2");
        }, 2000);
      });

      const p3 = new Promise((resolve, reject) => {
        setTimeout(() => {
          resolve("resolve p3");
        }, 3000);
      });

      // allSettled方法
      // 1. allSettled方法接收一个可迭代对象，返回一个Promise, 该Promise在所有给定的promise都已经完成（每个promise都已完成，无论完成状态如何）后完成。
      Promise.allSettled([p1, p2, p3]).then((res) => {
        console.log(res);
      });
    </script>
  </body>
</html>
